package main

import "fmt"

/*
	整数替换
给定一个正整数 n ，你可以做如下操作：
如果 n 是偶数，则用 n / 2替换 n 。
如果 n 是奇数，则可以用 n + 1或n - 1替换 n 。
n 变为 1 所需的最小替换次数是多少？


示例 1：
输入：n = 8
输出：3
解释：8 -> 4 -> 2 -> 1
 */

/*
# 1直接是咱们要的，无需转换
if n == 1
    return 0
if n 是偶数
    return 最小次数(n/2) + 1
# 奇数要看+1/-1哪个数字转换次数更少
if n 是奇数
    return max(最小次数(n+1), 最小次数(n-1)) + 1
 */

// 备忘录
var memo map[int]int

func integerReplacement(n int) int {
	memo = make(map[int]int)
	return dp(n)
}

func dp(n int) int {
	// 备忘录有结果可以直接返回
	if value, ok := memo[n]; ok {
		return value
	}
	if n == 1 {
		memo[1] = 0
		return 0
	}
	if n%2 == 0 {
		memo[n] = dp(n/2) + 1
	} else {
		memo[n] = min(dp(n-1), dp(n+1)) + 1
	}
	return memo[n]
}

func min(num1, num2 int) int {
	if num1 < num2 {
		return num1
	}
	return num2
}

func main() {
	fmt.Println(integerReplacement(65535))
}
